package com.mcp.converter.domain.rule.compatibility.function;

import com.mcp.converter.domain.checker.IncompatibilityDetail;
import com.mcp.converter.shared.response.sql.SQLElement;
import com.mcp.converter.domain.rule.compatibility.AbstractFunctionRule;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 其他特殊函数兼容性规则
 * OceanBase中特殊函数的支持程度和实现与Oracle有显著差异
 * @author zengxiong
 */
public class MiscFunctionRule extends AbstractFunctionRule {

    private static final String RULE_ID = "FN007";
    private static final String RULE_NAME = "特殊函数实现差异";
    private static final String RULE_DESCRIPTION = "OceanBase中特殊函数的支持程度和实现与Oracle存在显著差异";

    private static final Set<String> INCOMPATIBLE_MISC_FUNCTIONS = new HashSet<>(Arrays.asList(
        // JSON函数（OceanBase对JSON支持有限，仅保留部分支持的）
        "JSON_EXISTS",
        // 哈希函数（Oracle特有实现）
        "STANDARD_HASH",
        // 特殊统计函数（仅保留不在AdvancedFunctionRule中的）
        "STATS_T_TEST_INDEPU"
    ));

    public MiscFunctionRule() {
        super(RULE_ID, RULE_NAME, RULE_DESCRIPTION);
        setIncompatibilityDetail(
            "OceanBase中特殊函数在以下方面与Oracle存在差异：\n" +
            "1. JSON函数：\n" +
            "   - JSON_EXISTS函数部分支持（仅Oracle模式）：\n" +
            "     * 路径表达式支持不完整：仅支持简单路径，不支持复杂表达式\n" +
            "     * 不支持PASSING子句\n" +
            "     * 不支持ON ERROR处理\n" +
            "     * 支持的JSON数据类型有限（仅VARCHAR/TEXT）\n" +
            "     * JSON查询优化支持有限（如索引）\n" +
            "2. 哈希函数：\n" +
            "   - STANDARD_HASH算法不同\n" +
            "   - 参数处理差异\n" +
            "   - 返回值格式不一致\n" +
            "3. 统计函数：\n" +
            "   - 高级统计函数支持有限\n" +
            "   - 计算精度可能不同\n" +
            "   - NULL值处理差异",
            "可能导致：\n" +
            "1. JSON_EXISTS复杂查询失败\n" +
            "2. 哈希值计算不一致\n" +
            "3. 统计分析结果差异\n" +
            "4. 数据处理流程中断",
            "建议：\n" +
            "1. JSON处理：\n" +
            "   - 对于JSON_EXISTS：\n" +
            "     * 避免使用复杂路径表达式\n" +
            "     * 不使用PASSING子句\n" +
            "     * 避免依赖ON ERROR处理\n" +
            "     * 使用VARCHAR/TEXT类型存储JSON数据\n" +
            "   - 在应用层处理复杂JSON操作\n" +
            "2. 哈希计算：\n" +
            "   - 使用标准哈希函数\n" +
            "   - 在应用层实现特定哈希算法\n" +
            "3. 统计分析：\n" +
            "   - 简化统计计算\n" +
            "   - 使用基本聚合函数\n" +
            "   - 在应用层实现复杂统计",
            IncompatibilityDetail.Severity.MEDIUM
        );
    }

    @Override
    public boolean matches(Object target) {
        if (target instanceof SQLElement) {
            SQLElement element = (SQLElement) target;
            if (isFunctionElement(element)) {
                String functionName = element.getName().toUpperCase();
                return INCOMPATIBLE_MISC_FUNCTIONS.contains(functionName);
            }
        }
        return false;
    }
    
    @Override
    public Set<String> getIncompatibleFunctions() {
        return new HashSet<>(INCOMPATIBLE_MISC_FUNCTIONS);
    }
}